Skip to content

docs(wish): record release-manifest credential resolution (stable gate) - #2645

Merged
namastex888 merged 1 commit into
devfrom
docs/stable-gate-manifest-unblocked
Jul 25, 2026
Merged

namastex888 merged 1 commit into
devfrom
docs/stable-gate-manifest-unblocked

Conversation

@namastex888

Copy link
Copy Markdown
Contributor

Records that the release-manifests credential blocker is resolved, and triggers the dev release that proves it.

What was wrong

The manifest push failed on every release since 2026-07-20, freezing the channel pointers (stable 5.260720.10, dev 5.260723.8) while v5.260724.1 published 12 assets no channel could reach.

Two credential models failed identically, and the workflow's diagnostic blamed token scope both times. The actual cause was the main ruleset (9203218): a pull_request rule with an empty bypass_actors list rejects every direct push GH013 no matter how it authenticates.

What changed

PR #2643 (promoted in #2644 as 73bd48af) mints a per-run GitHub App token instead:

  • genie-release-bot, app id 4393439, contents:write + metadata:read only, no webhooks
  • installed on automagik-dev/genie alone (repository_selection: selected)
  • sole ruleset bypass actor: Integration:4393439:always — no user, role, or Actions bypass was added, so no human gained push-to-main
  • the token expires in ~1h, so no long-lived credential can push to main
  • the deploy-key policy was never touched

Why the criterion stays unchecked

The wish requires confirming "live after separately approved credential setup and the first post-merge dev release." Setup is done; the dev release is not. This commit is that release's trigger — merging it runs CI on dev, which fires version.yml → dev release → the first manifest push under the App identity.

If the dev manifest pointer advances past 5.260723.8, the criterion gets checked in a follow-up with the run as evidence. If it fails again, the failure lands here rather than in a claim.

bun test scripts/wishes-lint.test.ts → 11 pass / 0 fail.

The org-wide deploy-key ban made the ssh model unusable, and the
fine-grained PAT that replaced it still could not push: the 'main'
ruleset carried a pull_request rule with an empty bypass_actors list, so
every direct push was rejected GH013 regardless of token scope. That
froze the channel pointers from 2026-07-20 onward.

Resolved without touching the deploy-key policy: PR #2643 (promoted in
#2644 as 73bd48a) mints a per-run GitHub App token — genie-release-bot,
app id 4393439, contents:write + metadata:read only, installed on this
repository alone, sole ruleset bypass actor Integration:4393439:always.
No user, role, or Actions bypass was added, and the token expires in ~1h
so no long-lived credential can push to main.

The dev/homolog criterion stays UNCHECKED until a post-merge dev release
actually advances a channel manifest — this commit is that release's
trigger.
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Caution

The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased.

@coderabbitai

coderabbitai Bot commented Jul 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 1fd2fe03-f879-4d34-a8fc-bafa09151e56

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs/stable-gate-manifest-unblocked

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0ac0d5c7bc

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

- [ ] Production Environment approval requires an independent maintainer and is evidenced without exposing secrets. *(The live environment now admits only `main`, requires either `namastex888` or `vasconceloscezar`, prevents self-review, and forbids admin bypass; an end-to-end two-maintainer demonstration is still required.)*
- [x] Swap/promotion rollback and current artifact verification pass destructive-failure fixtures. *(7 fixtures; verify-release.sh realigned to real asset scheme)*
- [ ] Dev/homolog channel releases continue to publish without manual approval throughout and after this work. *(The main-controlled `version.yml` path remains reviewer-free, but manifest publication is intentionally blocked while the organization-wide deploy-key policy prevents provisioning the narrow `release-manifests` credential. Confirm live after separately approved credential setup and the first post-merge dev release.)*
- [ ] Dev/homolog channel releases continue to publish without manual approval throughout and after this work. *(The main-controlled `version.yml` path remains reviewer-free. **Credential setup is now complete (2026-07-25):** the org-wide deploy-key ban made the ssh model unusable, and the fine-grained PAT that replaced it still could not push because the `main` ruleset carried a `pull_request` rule with an empty `bypass_actors` list — every direct push was rejected `GH013` regardless of token scope. PR #2643 replaced both with a per-run GitHub App token (`genie-release-bot`, app id `4393439`, `contents:write` + `metadata:read` only, installed on this repository alone), promoted to `main` in #2644 as `73bd48af`. The App is the sole ruleset bypass actor (`Integration:4393439:always`); no user, role, or Actions bypass was added. Remains unchecked until the first post-merge dev release actually advances a channel manifest.)*

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Add evidence for the completed credential setup

The reviewed commit declares the external credential and ruleset setup complete, but the only committed settings export, qa/github-settings-evidence-20260714.json, still records bypass_actors: [], no manifest-write secret, and disabled release workflows. Without a new redacted settings/API capture, auditors cannot verify the App installation scope, permissions, environment secret names, or sole-bypass assertion; add and reference dated evidence for the 2026-07-25 state.

Useful? React with 👍 / 👎.

3. Exported evidence (GitHub API JSON or settings export, no secrets) committed under `qa/` in this wish — must capture the reviewer set **and** the prevent-self-review setting explicitly.
4. Deployment branch policy permits the protected `main` control ref used by `release.yml`; bot-authored automation cannot initiate stable, and a live two-maintainer run proves the initiating maintainer cannot approve it.
5. The `release-manifests` environment remains reviewer-free and restricted to `main`; its write credential is provisioned only after separate approval to change the organization-wide deploy-key policy, without adding a broader Actions or user-token bypass.
5. The `release-manifests` environment remains reviewer-free and restricted to `main`; its write credential is provisioned without adding a broader Actions or user-token bypass. **Resolved 2026-07-25 without touching the deploy-key policy:** the credential is a GitHub App (`genie-release-bot`, app id `4393439`) whose short-lived token is minted per run and expires in ~1h, so no long-lived credential can push to `main`. Its private key is held only as the `RELEASE_MANIFESTS_APP_ID`/`RELEASE_MANIFESTS_APP_PRIVATE_KEY` environment secrets, and the ruleset bypass names the App integration alone.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Treat the App private key as long-lived authority

If RELEASE_MANIFESTS_APP_PRIVATE_KEY is exposed, the one-hour installation-token expiry does not bound the compromise because the stored private key can continuously mint replacement tokens until it is revoked. Calling this an absence of long-lived credentials understates the security and rotation risk, especially since this same sentence acknowledges that the private key persists as an environment secret; document the short-lived token separately from the long-lived App key.

Useful? React with 👍 / 👎.

@namastex888
namastex888 merged commit 7b08499 into dev Jul 25, 2026
12 checks passed
@automagik-genie
automagik-genie deleted the docs/stable-gate-manifest-unblocked branch September 25, 2026 04:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant